Sé que según el estándar de punto único IEEE, el valor máximo de un flotador es 1.11111111111111111111111 * 2 ^ 127, que convertido en decimal es exactamente este número enorme -> 340282346638528859811704183484516925440.
¿Cómo es que recibo el error "el literal entero es demasiado grande para ser representado en cualquier tipo de entero" cuando intento asignar este valor a un flotante como este:
int main(){ float biggest=340282346638528859811704183484516925440; }¿No debería el compilador decir "bien, este es el valor máximo para un solo número de coma flotante y tengo que convertirlo al valor de 32 bits 011111110111111111111111111111111" donde el primer bit es el bit de signo, los siguientes ocho bits representan el exponente y todo otra cosa la mantisa?
Cuando 340282346638528859811704183484516925440 aparece en el código fuente, sin un . u otros caracteres que modificarían su tipo, es un literal entero, como se especifica en C 2018 6.4.4.1, que lo llama constante entera . Entonces, formalmente, el compilador lo interpreta como un tipo entero. El valor representado por este número es demasiado grande para representarlo en cualquier tipo de entero que admita su compilador, por lo que su compilador le advierte al respecto.
El hecho de que el valor que se le asigne a un float sea insuficiente. El compilador debe procesar el propio número antes de que tenga un valor que pueda convertir en un float .
La forma preferida de obtener el valor float finito máximo es incluir <float.h> con una directiva #include y usar FLT_MAX .
Si desea utilizar el número, puede convertirlo en una constante de coma flotante con el sufijo . . También puede agregar el sufijo f para que sea una constante float en lugar de double : 340282346638528859811704183484516925440.f .
El estándar C permite cierta holgura en la forma en que las implementaciones analizan las constantes de punto flotante, por lo que no se puede garantizar que el compilador produzca el valor exacto que representa el número, incluso si es representable en el tipo. Las buenas implementaciones de C lo harán. Sin embargo, puede evitar este problema utilizando la forma de punto flotante hexadecimal, que garantiza que producirá el resultado redondeado correctamente si la implementación de C utiliza un formato de punto flotante de base dos. De esta forma, el número es 0x1.fffffep127f .
Como no tiene un punto decimal ni un exponente, el número en su programa no se analiza como una constante de coma flotante decimal sino como una constante entera y supera el valor máximo de todos los tipos de enteros disponibles en su sistema. Su suposición sobre el comportamiento del compilador es incorrecta: el tipo de token se determina a partir de la sintaxis, no del contexto. Almacenar el valor de una constante entera en un float implica una conversión a tipo float , realizada en tiempo de compilación o en tiempo de ejecución.
Para especificar el número como una constante float , agregue un punto decimal y un sufijo F al final:
int main() { float biggest = 340282346638528859811704183484516925440.F; } Si solo escribe 340282346638528859811704183484516925440. la constante tendrá el tipo double y se convertirá en tipo float cuando se almacene en la biggest , lo que puede o no cambiar el valor.